/**
 * @file gamerenderer.h
 * @brief 高性能游戏渲染器 - 60FPS流畅渲染
 */

#ifndef GAMERENDERER_H
#define GAMERENDERER_H

#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QPropertyAnimation>
#include <QEasingCurve>
#include "clientprediction.h"

/**
 * @brief 高性能游戏渲染器
 * 
 * 现代化渲染特性：
 * 1. 60FPS恒定帧率
 * 2. 平滑插值动画
 * 3. 预测状态渲染
 * 4. 视觉特效系统
 * 5. 自适应性能调节
 */
class GameRenderer : public QWidget
{
    Q_OBJECT

public:
    explicit GameRenderer(QWidget *parent = nullptr);

    /**
     * @brief 渲染配置
     */
    struct RenderConfig {
        int targetFPS = 60;             // 目标帧率
        bool enableInterpolation = true; // 启用插值
        bool enableEffects = true;       // 启用特效
        bool enableVSync = true;         // 启用垂直同步
        float animationSpeed = 1.0f;     // 动画速度倍数
        int maxParticles = 100;          // 最大粒子数
    };

    /**
     * @brief 动画状态
     */
    struct AnimationState {
        QList<QPointF> snakePositions;  // 插值后的蛇位置
        QList<QPointF> foodPositions;   // 插值后的食物位置
        float snakeHeadRotation;        // 蛇头旋转角度
        float effectPhase;              // 特效相位
        qint64 lastUpdateTime;          // 最后更新时间
    };

public slots:
    /**
     * @brief 设置预测状态（来自客户端预测系统）
     * @param predictedState 预测状态
     */
    void setPredictedState(const ClientPrediction::PredictedState &predictedState);

    /**
     * @brief 设置服务器状态（权威状态）
     * @param serverState 服务器状态
     */
    void setServerState(const QList<QPoint> &snakeBody, const QList<QPoint> &foods);

    /**
     * @brief 设置渲染配置
     * @param config 渲染配置
     */
    void setRenderConfig(const RenderConfig &config);

    /**
     * @brief 播放特效
     * @param effectType 特效类型
     * @param position 特效位置
     */
    void playEffect(const QString &effectType, const QPointF &position);

    /**
     * @brief 设置自定义渲染帧（来自RenderThread）
     * @param frame 渲染好的帧
     */
    void setCustomFrame(const QPixmap &frame);

    /**
     * @brief 强制同步当前状态到目标状态（用于首帧切换）
     */
    void forceCurrentToTarget();

signals:
    /**
     * @brief 帧率统计信号
     * @param fps 当前FPS
     * @param frameTime 帧时间(ms)
     */
    void frameRateUpdated(int fps, float frameTime);

    /**
     * @brief 渲染性能信号
     * @param renderTime 渲染时间(ms)
     * @param triangleCount 三角形数量
     */
    void renderPerformance(float renderTime, int triangleCount);

protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

private slots:
    /**
     * @brief 渲染定时器回调（60FPS）
     */
    void onRenderTick();

    /**
     * @brief FPS统计定时器回调
     */
    void onFPSTimer();

private:
    /**
     * @brief 计算插值状态
     * @param deltaTime 时间差
     */
    void updateInterpolation(float deltaTime);

    /**
     * @brief 渲染游戏对象
     * @param painter 画笔
     */
    void renderGame(QPainter &painter);

    /**
     * @brief 渲染蛇
     * @param painter 画笔
     */
    void renderSnake(QPainter &painter);

    /**
     * @brief 渲染食物
     * @param painter 画笔
     */
    void renderFood(QPainter &painter);

    /**
     * @brief 渲染特效
     * @param painter 画笔
     */
    void renderEffects(QPainter &painter);

    /**
     * @brief 渲染UI覆盖层
     * @param painter 画笔
     */
    void renderUI(QPainter &painter);

    /**
     * @brief 渲染等待界面
     * @param painter 画笔
     */
    void renderWaitingScreen(QPainter &painter);

    /**
     * @brief 更新动画
     * @param deltaTime 时间差
     */
    void updateAnimations(float deltaTime);

    /**
     * @brief 计算平滑插值
     * @param from 起始值
     * @param to 目标值
     * @param factor 插值因子 (0.0-1.0)
     * @return 插值结果
     */
    QPointF lerp(const QPointF &from, const QPointF &to, float factor);

private:
    // === 渲染核心 ===
    QTimer *m_renderTimer;              // 60FPS渲染定时器
    QTimer *m_fpsTimer;                 // FPS统计定时器
    RenderConfig m_config;              // 渲染配置
    
    // === 游戏状态 ===
    ClientPrediction::PredictedState m_predictedState;  // 预测状态
    QList<QPoint> m_serverSnakeBody;    // 服务器蛇身体
    QList<QPoint> m_serverFoods;        // 服务器食物
    
    // === 动画状态 ===
    AnimationState m_currentAnimation;  // 当前动画状态
    AnimationState m_targetAnimation;   // 目标动画状态
    
    // === 渲染资源 ===
    QPixmap m_snakeHeadTexture;         // 蛇头纹理
    QPixmap m_snakeBodyTexture;         // 蛇身纹理
    QPixmap m_foodTexture;              // 食物纹理
    QPixmap m_backgroundTexture;        // 背景纹理
    
    // === 特效系统 ===
    struct Particle {
        QPointF position;
        QPointF velocity;
        float life;
        float maxLife;
        QColor color;
        float size;
    };
    QList<Particle> m_particles;       // 粒子列表
    
    // === 性能统计 ===
    qint64 m_lastFrameTime;             // 最后帧时间
    QList<float> m_frameTimeHistory;    // 帧时间历史
    int m_frameCount;                   // 帧计数
    float m_currentFPS;                 // 当前FPS
    
    // === 渲染参数 ===
    int m_cellSize;                     // 网格大小
    QSize m_gridSize;                   // 网格尺寸
    QRectF m_gameArea;                  // 游戏区域

    // === 多线程渲染 ===
    QPixmap m_customFrame;              // 自定义渲染帧
    QPixmap m_scaledFrame;              // 缓存的缩放帧
    QSize m_lastSize;                   // 上次的窗口大小
    QSize m_lastSourceFrameSize;        // 上次源帧尺寸（避免每帧重复缩放）

    // === 缓存优化 ===
    QPixmap m_gridCache;                // 网格缓存
    bool m_gridCacheValid;              // 网格缓存是否有效
    bool m_useCustomFrame;              // 是否使用自定义帧
    bool m_frameNeedsUpdate;            // 帧是否需要更新
};

#endif // GAMERENDERER_H
